/*
 * Copyright (c) 2021，上海福宇龙汽车科技有限公司
 * All rights reserved.
 * 文件名称: nfc_ctrl.h
 * 摘要:
 * 当前版本: V1.0.0 周伟
 * Date: 2024-03-18
 * 历史版本: Vx.x.x，编写者/修改者，修改时间，修改内容（重大发布时，总结重点变更内容）
 */

#ifndef _NFC_CTRL_H
#define _NFC_CTRL_H

#include "rte.h"

/*控制器接受最大延时*/
#define NFCCTRL_ACCEPT_MAX_DELMS (100U)
/*低功耗测试等待5S*/
#define NFCCTRL_LOW_POWER_DELMS (6000U)

/*控制器串口通信测试硬件CMD*/
#define NFCCTRL_UARTHARD_CMD (0x1109)
/*控制器串口通信测试软件CMD*/
#define NFCCTRL_UARTSOFT_CMD (0x1110)
/*控制器测试，全部通用Test_Fixture请求DATA*/
#define NFCCTRL_REQUEST_DATA (0x00000001)
/*控制器串口协议长度*/
#define NFCCTRL_UART_NUM (0x06)
typedef struct
{
    Rt_result (*NFCCTRL_test)(void);
} AppServer_NFCCTRL_Fun;

typedef struct
{
    Rt_result (*NFCCTRL_input_canrsp)(void); /*输入测试can报文解析*/
} AppServer_NFCCTRL_input_canrsp;



typedef enum
{
    OUT_MIN,      /*无*/
    P1_PE0,       /*母座序号：17 EHBL电源输出（输出高）*/
    P6_PB7,       /*母座序号：18 左转向灯输出（输出高）*/
    P7_PB4,      /*母座序号：06 右转向灯输出（输出高）*/
    P17_PB3,     /*母座序号：19 IG继电器控制输出（输出高）*/
    P18_PD7       /*母座序号：09 电喇叭或蜂鸣器输出（输出高）*/
} NFCCTRL_outpin; /*NFCCTRL_outpin*/

typedef enum
{
    IN_MIN,      /*无*/
    P4_PD6,      /*母座序号：20 左转向灯开关输入（0V有效，不输出时悬空）*/
    P9_PD5,      /*母座序号：08 应急灯开关（0V有效，不输出时悬空）*/
    P10_PD0,    /*母座序号：10 IGN输入（12V有效，不输出悬空）*/
    P12_PD4,     /*母座序号：21 右转向灯开关输入（0V有效，不输出时悬空）*/
    P16_PC12     /*母座序号：23 制动开关输入（12V有效，不输出时0V）*/
} NFCCTRL_input; /*NFCCTRL_input*/

typedef enum
{
    CAN_COM_TEST,   /*CAN通讯测试*/
    OUTPUT_TEST,    /*输出检测*/
    INP_TEST,       /*输入检测*/
    UART_COM_TEST,  /*串口通讯*/
    PRO_EHBL_TEST,  /*禁止EHBL输出测试*/
    LOW_POWER_TEST, /*低功耗检测*/
    NFC_CTRL_MAX    /*暂无测试阶段*/
} NFC_CTRL_stage;   /*NFC_CTRL测试阶段*/

union DataUnion {  
    uint8_t bytes[8];  
    uint64_t value;  
};

typedef union
{
    struct
    {
        uint16_t CMD;
        uint32_t DATA;
    } sig;
    uint8_t L_data[NFCCTRL_UART_NUM]; /*串口数据*/
} NFCCTRL_uart_data;

typedef struct
{
    bool NFCCTRL_send_data_only; /*只发送一次请求标志位*/
    bool NFCCTRL_lowpro_del_flag; /*低功耗等待时间*/
    NFCCTRL_outpin outpin_flag;  /*CTRL输出检测阶段标志*/
    NFCCTRL_input inputpin_flag; /*CTRL输入检测阶段标志*/
    uint8_t can_byte;            /*CTRL输入检测阶段判断CAN回复是否正确*/
    Com_softhard_stage v_stage;  /*CTRL串口通信测试版本号测试,软硬件阶段*/
    uint8_t Error_record;        /*CTRL串口通信测试版本号测试,硬件软件错误计数*/
} NFCCTRL_flag;                  /*控制器各阶段标志位*/

typedef struct
{
    NFC_CTRL_stage stage;           /*nfc控制器测试阶段*/
    Rt_result e_sta[NFC_CTRL_MAX];  /*6-11各阶段具体结果情况*/
    Rt_result CTRL_ver_comp;        /*控制器测试版本号比较结果*/
    Rt_result CTRL_results;         /*控制器测试步骤6-10是否流程走完*/
    nfc_can cantx;                  /*can发送数据结构体*/
    Sent_received_flag cantx_flag;  /*can发送标志*/
    nfc_can canrx;                  /*can发送数据结构体*/
    Sent_received_flag canrx_flag;  /*can接受标志*/
    NFCCTRL_uart_data uarttx;       /*Test_Fixture请求帧*/
    NFCCTRL_uart_data uartrx;       /*ctrl应答帧*/
    Sent_received_flag uarttx_flag; /*Test_Fixture请求帧串口发送标志*/
    Sent_received_flag uartrx_flag; /*EHBL应答帧串口接受标志*/

    NFCCTRL_flag N_flag; /*nfc控制器各阶段标志位*/
} NFCCTRL_test;

/*
 * 函数介绍: NFC控制器CAN接受回调函数
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void NFCCTRL_can_cbk(uint16_t id, uint8_t data[]);

/*
 * 函数介绍: NFC控制器应用层初始化
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void NFCCTRL_init(void);

/*
 * 函数介绍: NFC控制器CAN通讯测试计算发送给LCD的软硬件版本号
 * 参数:
 * 返回值: {*}
 * 备注:
 */
Rt_result NFCCTRL_rtlcd_can_swhd(Byte0Status St,NFCTestStatus Status, uint8_t candata[]);

/*
 * 函数介绍: NFC控制器uart接受回调函数
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void NFCCTRL_uart_cbk(uint16_t cmd, uint8_t data[]);

/*
 * 函数介绍: NFCCTRL测试低功耗功能是否正常
 * 参数:
 * 返回值: {*}
 * 备注: 
 * a. 下电闭锁成功后，等待5S后，进入睡眠
 * b. 先断开Q4，再打开Q1，使电源切换经过5.1R的采样电阻。
 * c.采样电阻将静态电流转换为相应的电压，并经过芯片LTC6102放大500倍后，得到的AD值给单片机判断静态电流是否合格。
 * d. 测试完后，断开Q1，把产品供电电源断开，并将测试结果发给LCD屏显示。
 */
Rt_result NFCCTRL_low_power(void);

/*
 * 函数介绍: 修改NFCCTRL测试阶段
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void Modify_NFCCTRL_testing_phase(NFC_CTRL_stage phase);

/*
 * 函数介绍: NFC控制器功能测试
 * 参数:
 * 返回值: {*}
 * 备注:
 */
Rt_result NFCCTRL_functional_test(void);

#endif
